Python 语言__xxx__笔记
在 Python 中,if __name__ == "__main__": 是一个非常常见的特殊用法,用于区分脚本是直接运行还是作为模块导入。除此之外,Python 中还有一些类似的特殊用法和机制,以下是一些常见的特殊用法及其说明:
1. if __name__ == "__main__":
- 含义:当一个 Python 文件被直接运行时,
__name__的值为"__main__";当它被作为模块导入时,__name__的值为模块名。 - 用途:用 于确保某些代码只在脚本被直接运行时执行,而在模块被导入时不执行。
- 示例:
def main():
print("This is the main function")
if __name__ == "__main__":
main()
2. __init__ 方法
- 含义:
__init__是类的构造方法,在创建类的实例时会自动调用,用于初始化对象的属性。 - 用途:为类的实例提供初始值。
- 示例:
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
p = Person("Alice", 25)
print(p.name, p.age)
3. __str__ 和 __repr__ 方法
__str__:定义对象被print()或str()调用时的字符串表示。__repr__:定义对象的“官方”字符串表示,通常用于调试或开发。- 示例:
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
def __str__(self):
return f"{self.name}, {self.age} years old"
def __repr__(self):
return f"Person(name={self.name}, age={self.age})"
p = Person("Alice", 25)
print(str(p)) # 输出: Alice, 25 years old
print(repr(p)) # 输出: Person(name=Alice, age=25)
4. 魔术方法(Magic Methods 或 Dunder Methods)
- 含义:以双下划线开头和结尾的方法,定义了类的特殊行为。
- 常见魔术方法:
__add__: 定义加法运算符+__len__: 定义len()方法__getitem__: 支持用索引访问对象__call__: 使对象可以像函数一样被调用
- 示例:
class MyList:
def __init__(self, items):
self.items = items
def __len__(self):
return len(self.items)
def __getitem__(self, index):
return self.items[index]
my_list = MyList([1, 2, 3])
print(len(my_list)) # 输出: 3
print(my_list[1]) # 输出: 2
5. __slots__
- 含义:限制类的属性,防止动态添加其他属性,从而节省内存。
- 用途:优化内存使用,尤其是当需要创建大量实例时。
- 示例:
class Person:
__slots__ = ['name', 'age']
def __init__(self, name, age):
self.name = name
self.age = age
p = Person("Alice", 25)
p.name = "Bob" # 正常
p.address = "USA" # 报错:AttributeError: 'Person' object has no attribute 'address'
6. __dict__
- 含义:返回一个字典,包含对象的所有属性及其值。
- 用途:查看或操作对象的属性。
- 示例:
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
p = Person("Alice", 25)
print(p.__dict__) # 输出: {'name': 'Alice', 'age': 25}
7. __call__
- 含义:使对象可以像函数一样被调用。
- 用途:定义对象的“调用”行为。
- 示例:
class Counter:
def __init__(self):
self.count = 0
def __call__(self):
self.count += 1
return self.count
c = Counter()
print(c()) # 输出: 1
print(c()) # 输出: 2
8. __enter__ 和 __exit__
- 含义:用于上下文管理协议,支持
with语句。 - 用途:定义资源的初始化和清理操作。
- 示例:
class FileManager:
def __init__(self, filename, mode):
self.filename = filename
self.mode = mode
def __enter__(self):
self.file = open(self.filename, self.mode)
return self.file
def __exit__(self, exc_type, exc_value, traceback):
self.file.close()
with FileManager("test.txt", "w") as f:
f.write("Hello, World!")